<?php

namespace app\models\tableModel;

use app\entity\PageListEntity;
use app\models\tableModel\base\Setting;
use app\service\tool\ConvertService;
use app\service\tool\FileService;
use app\service\tool\GenerateService;
use app\service\tool\UtilsService;
use yii\db\Expression;
use yii\db\ExpressionInterface;
use yii\helpers\ArrayHelper;
use yii\helpers\Html;

/**
 * [站点设置]操作模型
 * 作者: Editor Name
 * 日期: 2021/10/29
 * 时间: 18:54:06
 */
class SettingModel extends Setting
{

    /**
     * 所在分组 列表
     * @var array
     */
    private static $groupList = [
        [
            'key'   => 'site',
            'value' => 1,
            'text'  => '站点设置'
        ],
        [
            'key'   => 'third',
            'value' => 2,
            'text'  => '第三方设置'
        ],
        [
            'key'   => 'other',
            'value' => 99,
            'text'  => '其他设置'
        ],
    ];

    /**
     * 状态 列表
     * @var array
     */
    private static $statusList = [
        [
            'key'   => 'disabled',
            'value' => -1,
            'text'  => '禁用'
        ],
        [
            'key'   => 'open',
            'value' => 1,
            'text'  => '开启'
        ]
    ];

    /**
     * 字段类型 列表
     * @var array
     */
    private static $typeList = [
        [
            'key'   => 'input',
            'value' => 1,
            'text'  => '文本框'
        ],
        [
            'key'   => 'textarea',
            'value' => 2,
            'text'  => '长文本'
        ],
        [
            'key'   => 'radio',
            'value' => 3,
            'text'  => '单选框'
        ],
        [
            'key'   => 'check',
            'value' => 4,
            'text'  => '多选框'
        ],
        [
            'key'   => 'select',
            'value' => 5,
            'text'  => '下拉框'
        ],
        [
            'key'   => 'image',
            'value' => 6,
            'text'  => '图片上传'
        ],
        [
            'key'   => 'json',
            'value' => 7,
            'text'  => 'JSON数据'
        ],
        [
            'key'   => 'html',
            'value' => 8,
            'text'  => 'HTML文本'
        ],
        [
            'key'   => 'excel',
            'value' => 9,
            'text'  => 'Excel上传'
        ],
    ];

    /**
     * 是否必填 列表
     * @var array
     */
    private static $isRequiredList = [
        [
            'key'   => 'yes',
            'value' => 1,
            'text'  => '必填'
        ],
        [
            'key'   => 'no',
            'value' => -1,
            'text'  => '非必填'
        ]
    ];

    /**
     * 是否可添加条目 列表
     * @var array
     */
    private static $canAddRowList = [
        [
            'key'   => 'yes',
            'value' => 1,
            'text'  => '允许'
        ],
        [
            'key'   => 'no',
            'value' => -1,
            'text'  => '不允许'
        ]
    ];

    /**
     * 是否顶部分割线 列表
     * @var array
     */
    private static $topLineList = [
        [
            'key'   => 'yes',
            'value' => 1,
            'text'  => '是'
        ],
        [
            'key'   => 'no',
            'value' => -1,
            'text'  => '否'
        ]
    ];

    /**
     * 排序最大值
     * @var int
     */
    protected static $maxSort = 999999;
    /**
     * 排序最小值
     * @var int
     */
    protected static $minSort = -999999;

    /**
     * 规则验证
     * @return array
     */
    public function rules()
    {

        // [字段类型]列表
        $typeList = array_column(self::getTypeList(), 'value');
        // [所在分组]列表
        $groupList = array_column(self::getGroupList(), 'value');
        // [状态]列表
        $statusList = array_column(self::getStatusList(), 'value');
        // [是否必填]列表
        $isRequiredList = array_column(self::getIsRequiredList(), 'value');
        // [是否可条目添加]列表
        $canAddRowList = array_column(self::getCanAddRowList(), 'value');
        // [是否底部分割线]列表
        $topLineList = array_column(self::getTopLineList(), 'value');
        // 最大排序
        $maxSort = self::getMaxSort();
        // 最小排序
        $minSort = self::getMinSort();

        $parent = parent::rules();
        return ArrayHelper::merge($parent, [
            ['type', 'in', 'range' => $typeList, 'message' => '字段类型不合法'],
            ['group', 'in', 'range' => $groupList, 'message' => '所在分组不合法'],
            ['status', 'in', 'range' => $statusList, 'message' => '状态不合法'],
            ['is_required', 'in', 'range' => $isRequiredList, 'message' => '是否必填不合法'],
            ['can_add_row', 'in', 'range' => $canAddRowList, 'message' => '是否可条目添加不合法'],
            ['top_line', 'in', 'range' => $topLineList, 'message' => '是否底部分割线不合法'],
            ['key', 'match', 'pattern' => '/[a-z|A-Z|0-9|\_]+/',
                             'message' => '只允许大小写字母、数字、下划线'],
            ['sort', 'integer', 'max'     => $maxSort, 'min' => $minSort],
            ['value', 'checkValue'],
            ['option', 'checkOption']
        ]);
    }

    /**
     * 重写label的 文字
     */
    public function attributeLabels()
    {

        $parent = parent::attributeLabels();
        return array_merge($parent, [
            'key'         => '字段名',
            'title'       => '字段标题',
            'value'       => '字段值',
            'group'       => '所在分组',
            'option'      => '选其他项',
            'description' => '说明',
            'status'      => '状态',
            'type'        => '字段类型',
            'length'      => '字段长度',
            'reg'         => '验证规则',
            'add_time'    => '添加时间',
            'update_time' => '更新时间',
            'unit'        => '尾部单位',
        ]);
    }

    /**
     * 场景
     * @return array
     */
    public function scenarios()
    {

        $scenarios = parent::scenarios();
        return ArrayHelper::merge($scenarios, [
            // 自定义场景 (无用请删除)
            'scUpdate' => [
                'someAttributes'
            ]
        ]);
    }

    /**
     * 检测值
     * @param null $attributeNames
     * @param bool $clearErrors
     * @return bool
     */
    public function checkValue($attributeNames = null, $clearErrors = true)
    {

        ### 验证字段长度
        $stageVal = is_array($this->value) ?
            json_encode($this->value, JSON_UNESCAPED_UNICODE) : $this->value;
        if (strlen($stageVal) > $this->length && !empty($this->length)) {

            $this->addError('value', '字段内容过长:' . strlen($stageVal) . '个字符');
            return false;
        }

        ### 是否必须
        if ($this->is_required == self::getIsRequiredYes() && !isset($this->value)) {

            $this->addError('value', '字段值不能为空');
            return false;
        }

        ### [JSON]类型 确保每一条，键值
        if ($this->type == self::getTypeJson()) {

            // 确保数组
            $stageVal = ConvertService::isJson($this->value) ?
                json_decode($this->value, true) : $this->value;
            // 取出字段选项键值列表
            $keys = array_column($this->option, 'key');
            foreach ($stageVal as $k => $v) {
                // 检测数组有空值 返回错误不允许有空值
                foreach ($v as $kk => $vv) if (!isset($vv) && in_array($kk, $keys)) {
                    $this->addError('option',
                        '请确认【' . $this->title . '】各项数据已填写完整'
                    );
                    return false;
                }
            }
        }

        return true;
    }

    /**
     * 检测选项
     * @param null $attributeNames
     * @param bool $clearErrors
     * @return bool
     */
    public function checkOption($attributeNames = null, $clearErrors = true)
    {

        // 验证字段长度
        if (!in_array($this->type, self::valueNeedOptList()) && empty($this->option)) return true;
        // 是否空验证
        if (empty($this->option)) {
            // 类型文本
            $typeTxt = self::getTypeText($this->type);
            $this->addError('option', $typeTxt . '类型必须填写选项字段值');
            return false;
        }

        ### 确保每一条，键值等都有
        // 非[JSON]值直接通过
        if ($this->type != self::getTypeJson()) return true;
        // 类型文本
        $typeTxt = self::getTypeText($this->type);
        foreach ($this->option as $k => $v) {
            if (empty($v['key'])) {
                $this->addError('option', $typeTxt . '类型必须填写选项键');
                return false;
            }
            if (empty($v['text'])) {
                $this->addError('option', $typeTxt . '类型必须填写选项文本');
                return false;
            }
        }
        return true;
    }

    /**
     * 自定义过滤单条[where]
     *  ` 仅限于通过方法[loadWhere]传入的条件, 可以在其中自定义逻辑
     *  ` 保证最终返回值为一维数组[Yii2]通用条件格式[运算符, 字段名, 值]
     * @param $condition array [sql]查询条件, 严格遵循Yii多条件查询:[运算符, 字段名, 值]
     * @return array
     */
    public function whereCustomFilter($condition = [])
    {

        // // 例：字段为编号 —— 操作符使用[IN]
        // if ($field == 'id') {
        //     return ['IN', $condition[1], $value[2]];
        // }

        // 最终返回必须为数组：[运算符, 字段名, 值]，符合Yii2规范
        return $condition;
    }

    /**
     * 获取分页信息
     * @param integer $page 当前页
     * @param integer $limit 获取几条
     * @param null $field 获取字段
     * @return PageListEntity
     */
    public function getPaginate($page, $limit, $field = null)
    {

        // 当前页面计算
        $page = max($page - 1, 0);

        // 查找的 字段空的 就默认给列表
        if (!$field) $field = '*';

        // 基础 where加载完毕
        $this->getBaseSql()->select($field);

        // 是否已经有自定义排序
        if (property_exists($this, 'orderBy') && !empty($this->orderBy)) {
            $this->getBaseSql()->orderBy($this->orderBy);
        } else { // 无自定义排序
            $this->getBaseSql()->orderBy('sort desc, key desc');
        }

        // 数据的获取 分页等
        $list = $this->getBaseSql()->offset($page * $limit)
            ->limit($limit)
            ->asArray()
            ->all();

        // 格式化数据后的列表
        $list = $this->formatData($list, ['imageStyle' => 'w300']);
        // 总数量
        $total = $this->getBaseSql()->count();

        return PageListEntity::loadModel(compact('list', 'total'));
    }

    /**
     * 格式化列表活详情数据
     * @param array $list 列表
     * @param array $opt 其他设置
     * @return mixed
     */
    public static function formatData($list, $opt = [])
    {

        // 为空直接返回
        if (empty($list)) return $list;
        // 需要返回第一组（可能不是二维数组）
        $needFirst = false;
        if (!is_array(array_values($list)[0])) {
            $needFirst = true;
            $list      = [$list];
        }

        ### 某些参数初始化
        $imageStyle = empty($opt['imageStyle']) ? 'w60' : $opt['imageStyle'];

        ### 开始格式化
        foreach ($list as $k => &$v) {

            // 如果是特殊的键值走单独逻辑
            if (isset($v['key']) && $v['key'] == 'skin') {
                $v = self::formatForSkin($v);
            }

            // 更新时间
            if (isset($v['add_time'])) {
                $v['add_time_text']   = date('Y-m-d H:i:s', $v['add_time']);
                $v['add_time_text_s'] = date('Y-m-d', $v['add_time']);
            }

            // 更新时间
            if (isset($v['update_time'])) {
                $v['update_time_text']   = date('Y-m-d H:i:s', $v['update_time']);
                $v['update_time_text_s'] = date('Y-m-d', $v['update_time']);
            }

            // 状态 文本
            if (isset($v['status'])) {
                $v['status_text'] = self::getStatusText($v['status']);
            }

            // 分组 文本
            if (isset($v['group'])) {
                $v['group_text'] = self::getGroupText($v['group']);
            }

            // 分组 文本
            if (isset($v['type'])) {
                $v['type_text'] = self::getTypeText($v['type']);
            }

            // [option]选项
            if (isset($v['option']) && ConvertService::isJson($v['option'])) {

                $v['option'] = json_decode($v['option'], JSON_UNESCAPED_UNICODE);
            }

            // [类型]是[HTML]需要转换
            if (isset($v['value']) && isset($v['type']) && $v['type'] == self::getTypeHtml()) {

                $v['value'] = Html::decode($v['value']);
            } // [类型]是[IMAGE]需要转换
            else if (isset($v['value']) && isset($v['type']) && $v['type'] == self::getTypeImage()) {
                $v['value'] = FileService::addImgDomain($v['value'], $imageStyle);
            } // [类型]是[JSON]需要转换
            else if (isset($v['value']) && ConvertService::isJson($v['value'])) {

                $v['value'] = json_decode($v['value'], JSON_UNESCAPED_UNICODE);
            }
        }

        reset($list);
        return $needFirst ? current($list) : $list;
    }

    /**
     * 添加|保存
     * @param bool $runValidation 是否仅仅运行验证，不运行保存
     * @param string[]|null|string $attributeNames 仅仅保存某几个字段
     * @return bool
     */
    public function save($runValidation = false, $attributeNames = null)
    {

        ### 批量操作[缓存保存前一些格式化]
        foreach ($this->getAttributes() as $k => $v) {
            // 字段类型为[JSON]类型需要转为数组 - 保存自动转为[JSON]
            if (is_string($v) && ConvertService::isJson($v)) {
                $this->setAttribute($k, json_decode($v, true));
            }
        }

        ### 单个操作[缓存保存前一些格式化]
        $nowTime = time();
        // 新建时的一些操作
        if (empty($this->id)) {
            $this->id       = GenerateService::newMongoId(); // 编号
            $this->add_time = $nowTime;                   // 添加时间
        }
        // 更新时间
        $this->update_time = $nowTime;
        // [类型]是[HTML]需要转换
        if ($this->type == self::getTypeHtml()) {
            $this->setAttribute('value', Html::encode($this->value));
        }
        // [类型]是需要[Image]操作
        if ($this->type == self::getTypeImage()) {
            $this->value = FileService::delImgDomain($this->value);
        }
        // [类型]是需要[JSON]操作
        else if (in_array($this->type, self::valueNeedJsonList())) {
            // 必须转化为数组
            $this->value = !is_array($this->value) ? [$this->value] : $this->value;
            $this->value = json_encode($this->value, JSON_UNESCAPED_UNICODE);
        }
        // 如果选项是字符串返回数组
        if (is_string($this->option) && ConvertService::isJson($this->option)) {
            $this->option = json_decode($this->option, true);
        }

        ### 检测
        if ($this->hasErrors() || !$this->validate($attributeNames)) {

            // 记录下错误日志
            \Yii::error([
                "`````````````````````````````````````````````````````````",
                "``                      数据库错误                       ``",
                "`` 错误详情: [[设置表]操作模型]验证数据失败                   ``",
                "`` 错误信息和参数详情:                                     ``",
                "`````````````````````````````````````````````````````````",
                $this->getAttributes(),
                $this->getErrors()
            ], 'db');
            return false;
        }

        ### 需要 && 执行保存
        if (!$runValidation && !parent::save(false, $attributeNames)) {

            // 记录下错误日志
            \Yii::error([
                "`````````````````````````````````````````````````````````",
                "``                      数据库错误                       ``",
                "`` 错误详情: [[设置表]操作模型]保存数据失败                  ``",
                "`` 错误信息和参数详情:                                     ``",
                "`````````````````````````````````````````````````````````",
                $this->getAttributes(),
                $this->getErrors()
            ], 'db');
            return false;
        }

        return true;
    }


    /**
     * [静态方法]批量快速更新某些字段
     * @param $condition
     * @param array $fieldVal
     * @return bool
     */
    public static function updateField($condition, $fieldVal = [])
    {

        // 验证字段
        $model = self::loadModel();
        $model->load($fieldVal, '');
        if (!$model->validate(array_keys($fieldVal))) {
            $error = UtilsService::getModelError($model->getErrors());
            self::$error_[$error['column']] = [$error['msg']];
            return false;
        }
        // 重新取值规则化后的特定值列表
        $fieldVal = $model->getAttributes(array_keys($fieldVal));

        $db = \Yii::$app->db->createCommand();

        try {

            ### 数据库操作
            $db->update(self::tableName(), $fieldVal, $condition)->execute();

            // 否则成功
            return true;
        } catch (\Exception $error) {

            // 记录下错误日志
            \Yii::error([
                "`````````````````````````````````````````````````````````",
                "``                      数据库错误                       ``",
                "`` 错误详情: [[设置表]操作模型]批量修改[指定字段]失败，   ``",
                "``         {$error->getMessage()}                       ``",
                "`` SQL语句: {$db->getRawSql()}                         ``",
                "`` 错误信息和参数详情:                                     ``",
                "`````````````````````````````````````````````````````````",
                $error->getTraceAsString()
            ], 'db');

            // 静态错误
            self::$error_['db_error'] = empty(self::$error_['db_error']) ?
                [$error->getMessage()] : array_merge(self::$error_['db_error'], [$error->getMessage()]);

            return false;
        }
    }

    /**
     * 批量添加数据
     * @param array $createData
     * @return bool
     */
    public static function createData($createData = [])
    {

        $db = \Yii::$app->db->createCommand();
        try {

            ### 先数据格式化
            // 如果是一维数组则二维数组化
            if (ArrayHelper::isAssociative($createData)) {
                $createData = ArrayHelper::toArray($createData);
            }
            $values = [];
            foreach ($createData as $k => $v) {

                $model = self::loadModel();
                $model->load($createData[$k], '');
                if (!$model->save(true)) {
                    // 取出错误信息
                    $error = UtilsService::getModelError($model->errors);
                    // 添加到静态方法上
                    self::$error_[$error['column']] = [$error['msg']];
                    return false;
                }

                $createData[$k] = $model->getAttributes($model::getTableSchema()->getColumnNames());

                // 循环一些数据
                foreach ($createData[$k] as $kc => $vc) {
                    // 字段类型为[JSON]类型需要转为[JSON]
                    if (is_array($vc)) {
                        $createData[$k][$kc] = json_encode($vc, JSON_UNESCAPED_UNICODE);
                        continue;
                    }
                }

                // 值赋值
                $values[] = array_values($createData[$k]);;
            }

            ### 取出此次操作的字段列表
            $columns = !current($createData) ? [] : array_keys(current($createData));

            // 执行
            return $db->batchInsert(self::tableName(), $columns, $values)->execute();
        } catch (\Exception $error) {

            // 记录下错误日志
            \Yii::error([

                "`````````````````````````````````````````````````````````",
                "``                      数据库错误                       ``",
                "`` 错误详情: [[设置表]操作模型]批量添加[数据]失败，      ``",
                "``         {$error->getMessage()}                       ``",
                "`` SQL语句: {$db->getRawSql()}                         ``",
                "`` 错误信息和参数详情:                                     ``",
                "`````````````````````````````````````````````````````````",
                $error->getTraceAsString()
            ], 'db');

            // 静态错误
            self::$error_['db_error'] = empty(self::$error_['db_error']) ?
                [$error->getMessage()] : array_merge(self::$error_['db_error'], [$error->getMessage()]);

            return false;
        }
    }

    /**
     * 更新某些字段自增|自减
     * @param $condition
     * @param array $fieldVal 增/减加的字段
     * @return bool
     */
    public static function updateCounter($condition, $fieldVal = [])
    {

        $model = new self();
        foreach ($fieldVal as $k => $v) {

            if (!$model->hasAttribute($k)) {

                unset($fieldVal[$k]);
                continue;
            }
        }

        try {

            $model->updateAllCounters($fieldVal, $condition);

            // 否则成功
            return true;
        } catch (\Exception $error) {

            // 记录下错误日志
            \Yii::error([

                "`````````````````````````````````````````````````````````",
                "``                      数据库错误                       ``",
                "`` 错误详情: [[设置表]操作模型]批量增/减[指定字段]失败   ``",
                "``         {$error->getMessage()}                       ``",
                "`` 错误信息和参数详情:                                     ``",
                "`````````````````````````````````````````````````````````",
                $error->getTraceAsString()
            ], 'db');

            // 静态错误
            self::$error_['db_error'] = empty(self::$error_['db_error']) ?
                [$error->getMessage()] : array_merge(self::$error_['db_error'], [$error->getMessage()]);

            return false;
        }
    }

    /**
     * 格式化某些数据(皮肤)
     * @param array $detail 详情数据
     * @return array
     */
    public static function formatForSkin($detail = [])
    {

        ### 获取皮肤模板下文件夹列表
        $folder = FileService::getFileList(
            \Yii::getAlias(\Yii::$app->params['frontTempPath'])
        );
        $option = [];
        foreach ($folder as $k => &$v) {
            $option[] = [
                'key'   => $v['fileName'],
                'text'  => $v['fileName'],
                'value' => $v['fileName']
            ];
        }
        $detail['option'] = $option;

        return $detail;
    }


    /**
     * 获取[所在分组]文本
     * @param $value
     * @return mixed|string
     */
    public static function getGroupText($value)
    {

        // 列表
        $list = array_column(self::$groupList, null, 'value');
        // 不合法 - 不存在
        if (empty($list[$value]['text'])) return '--';

        // 最终正常返回
        return $list[$value]['text'];
    }

    /**
     * 获取[所在分组]列表 值
     * @return mixed|string
     */
    public static function getGroupList()
    {

        // 最终正常返回
        return self::$groupList;
    }


    /**
     * 获取[状态][关闭]值
     * @return mixed
     */
    public static function getStatusDisabled()
    {

        $list = array_column(self::$statusList, null, 'key');
        return $list['disabled']['value'];
    }

    /**
     * 获取[状态][开启]值
     * @return mixed
     */
    public static function getStatusOpen()
    {

        $list = array_column(self::$statusList, null, 'key');
        return $list['open']['value'];
    }

    /**
     * 获取[状态]文本
     * @param $value
     * @return mixed|string
     */
    public static function getStatusText($value)
    {

        // 列表
        $list = array_column(self::$statusList, null, 'value');
        // 不合法 - 不存在
        if (empty($list[$value]['text'])) return '--';

        // 最终正常返回
        return $list[$value]['text'];
    }

    /**
     * 获取[状态]列表 值
     * @return mixed|string
     */
    public static function getStatusList()
    {

        // 最终正常返回
        return self::$statusList;
    }


    /**
     * 获取[类型][select]值
     * @return mixed
     */
    public static function getTypeSelect()
    {

        $list = array_column(self::$typeList, null, 'key');
        return $list['select']['value'];
    }

    /**
     * 获取[类型][check]值
     * @return mixed
     */
    public static function getTypeCheck()
    {

        $list = array_column(self::$typeList, null, 'key');
        return $list['check']['value'];
    }

    /**
     * 获取[类型][radio]值
     * @return mixed
     */
    public static function getTypeRadio()
    {

        $list = array_column(self::$typeList, null, 'key');
        return $list['radio']['value'];
    }

    /**
     * 获取[类型][HTML]值
     * @return mixed
     */
    public static function getTypeHtml()
    {

        $list = array_column(self::$typeList, null, 'key');
        return $list['html']['value'];
    }

    /**
     * 获取[类型][JSON]值
     * @return mixed
     */
    public static function getTypeJson()
    {

        $list = array_column(self::$typeList, null, 'key');
        return $list['json']['value'];
    }

    /**
     * 获取[类型][Image]值
     * @return mixed
     */
    public static function getTypeImage()
    {

        $list = array_column(self::$typeList, null, 'key');
        return $list['image']['value'];
    }

    /**
     * 获取[类型]文本
     * @param $value
     * @return mixed|string
     */
    public static function getTypeText($value)
    {

        // 列表
        $list = array_column(self::$typeList, null, 'value');
        // 不合法 - 不存在
        if (empty($list[$value]['text'])) return '--';

        // 最终正常返回
        return $list[$value]['text'];
    }

    /**
     * 获取[类型]列表 值
     * @return mixed|string
     */
    public static function getTypeList()
    {

        // 最终正常返回
        return self::$typeList;
    }

    /**
     * 获取[类型]需要[Option]字段的列表 值
     * @return mixed
     */
    public static function valueNeedOptList()
    {

        return [
            self::getTypeRadio(),
            self::getTypeCheck(),
            self::getTypeSelect(),
            self::getTypeJson(),
        ];
    }

    /**
     * 获取[值]需要[JSON]操作的列表 值
     * @return mixed
     */
    public static function valueNeedJsonList()
    {

        return [
            self::getTypeCheck(),
            self::getTypeJson(),
        ];
    }


    /**
     * 获取[是否必填][开启]值
     * @return mixed
     */
    public static function getIsRequiredYes()
    {
        $list = array_column(self::$isRequiredList, null, 'key');
        return $list['yes']['value'];
    }

    /**
     * 获取[是否必填][关闭]值
     * @return mixed
     */
    public static function getIsRequiredNo()
    {
        $list = array_column(self::$isRequiredList, null, 'key');
        return $list['no']['value'];
    }

    /**
     * 获取[是否必填]文本
     * @param $value
     * @return mixed|string
     */
    public static function getIsRequiredText($value)
    {

        // 列表
        $list = array_column(self::$isRequiredList, null, 'value');
        // 不合法 - 不存在
        if (empty($list[$value]['text'])) return '--';

        // 最终正常返回
        return $list[$value]['text'];
    }

    /**
     * 获取[是否必填]列表 值
     * @return mixed|string
     */
    public static function getIsRequiredList()
    {

        // 最终正常返回
        return self::$isRequiredList;
    }


    /**
     * 获取[是否可添加条目][开启]值
     * @return mixed
     */
    public static function getCanAddRowYes()
    {
        $list = array_column(self::$canAddRowList, null, 'key');
        return $list['yes']['value'];
    }

    /**
     * 获取[是否可添加条目][关闭]值
     * @return mixed
     */
    public static function getCanAddRowNo()
    {
        $list = array_column(self::$canAddRowList, null, 'key');
        return $list['no']['value'];
    }

    /**
     * 获取[是否可添加条目]文本
     * @param $value
     * @return mixed|string
     */
    public static function getCanAddRowText($value)
    {

        // 列表
        $list = array_column(self::$canAddRowList, null, 'value');
        // 不合法 - 不存在
        if (empty($list[$value]['text'])) return '--';

        // 最终正常返回
        return $list[$value]['text'];
    }

    /**
     * 获取[是否可添加条目]列表 值
     * @return mixed|string
     */
    public static function getCanAddRowList()
    {

        // 最终正常返回
        return self::$canAddRowList;
    }


    /**
     * 获取[是否底部分割线][是]值
     * @return mixed
     */
    public static function getTopLineYes()
    {
        $list = array_column(self::$topLineList, null, 'key');
        return $list['yes']['value'];
    }

    /**
     * 获取[是否底部分割线][否]值
     * @return mixed
     */
    public static function getTopLineNo()
    {
        $list = array_column(self::$topLineList, null, 'key');
        return $list['no']['value'];
    }

    /**
     * 获取[是否底部分割线]文本
     * @param $value
     * @return mixed|string
     */
    public static function getTopLineText($value)
    {

        // 列表
        $list = array_column(self::$topLineList, null, 'value');
        // 不合法 - 不存在
        if (empty($list[$value]['text'])) return '--';

        // 最终正常返回
        return $list[$value]['text'];
    }

    /**
     * 获取[是否底部分割线]列表 值
     * @return mixed|string
     */
    public static function getTopLineList()
    {

        // 最终正常返回
        return self::$topLineList;
    }


    /**
     * 返回排序最大值
     * @return int
     */
    public static function getMaxSort()
    {
        return self::$maxSort;
    }

    /**
     * 返回排序最小值
     * @return int
     */
    public static function getMinSort()
    {
        return self::$minSort;
    }


    /**
     * 获取静态错误
     * @return mixed
     */
    public static function getStaticErrors()
    {
        return self::$error_;
    }
}
